//package com.bestcem.xm.txtanls.job.config;
//
//import com.bestcem.xm.txtanls.job.CreatedTrainingJob;
//import com.bestcem.xm.txtanls.job.InactiveTrainingJob;
//import lombok.extern.slf4j.Slf4j;
//import org.quartz.*;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
//import org.springframework.context.annotation.Configuration;
//
//import javax.annotation.PostConstruct;
//import javax.annotation.Resource;
//
///**
// * @author gy.liu
// * @date 2021/5/21
// */
//@Slf4j
//@Configuration
//@ConditionalOnProperty(value = "app.xm.is-baseline", havingValue = "false", matchIfMissing = true)
//public class TrainJobConfig {
//    private static final Logger EMAIL_LOG = LoggerFactory.getLogger("EmailErrorLog");
//
//    /**
//     * 训练项目前加锁的key前缀
//     */
//    public static final String TRAIN_JOB_LOCK_PREFIX = "txtanls:train";
//
//    /**
//     * 定时任务开关
//     */
//    @Value("${spring.quartz.auto-startup:false}")
//    private boolean taskEnable;
//
//    /**
//     * 实时训练
//     */
//    @Value("${app.txtanls.task.created-cron:*/5 * * * * ?}")
//    private String createdCron;
//
//    /**
//     * 增量训练
//     */
//    @Value("${app.txtanls.task.inactive-cron:0 0 0 * * ?}")
//    private String inactiveCron;
//
//    /**
//     * Quartz 调度器
//     */
//    @Resource
//    private Scheduler scheduler;
//
//    /**
//     * 初始化job
//     */
//    @PostConstruct
//    private void init() {
//        if (!taskEnable) {
//            log.error("[Txtanls] 定时任务未开启");
//            return;
//        }
//        initJob();
//    }
//
//    /**
//     * 初始化所有定时任务
//     */
//    private void initJob() {
//        if (log.isInfoEnabled()) {
//            log.info("[Txtanls] 初始化定时任务开始");
//        }
//        String jobGroupName = "txtanls:jobGroup";
//        String triggerGroupName = "txtanls:triggerGroup";
//
//        // 新建项目实时训练
//        String createdJobName = "txtanls:created";
//        CronScheduleBuilder createdJobScheduleBuilder = CronScheduleBuilder.cronSchedule(createdCron);
//
//        // 问卷项目增量训练
//        String inactiveJobName = "txtanls:inactive";
//        CronScheduleBuilder inactiveJobScheduleBuilder = CronScheduleBuilder.cronSchedule(inactiveCron);
//
//        // 注册定时任务
//        registerJob(createdJobName, jobGroupName, triggerGroupName, CreatedTrainingJob.class, createdJobScheduleBuilder);
//        registerJob(inactiveJobName, jobGroupName, triggerGroupName, InactiveTrainingJob.class, inactiveJobScheduleBuilder);
//        if (log.isInfoEnabled()) {
//            log.info("[Txtanls] 初始化定时任务完成");
//        }
//    }
//
//    /**
//     * 注册定时任务
//     *
//     * @param name             任务唯一标识; 用于构造 任务名/触发器名
//     * @param jobGroupName     任务组名
//     * @param triggerGroupName 触发器组名
//     * @param jobClass         任务实现类
//     * @param scheduleBuilder  任务对应的调度规则
//     */
//    private void registerJob(String name, String jobGroupName, String triggerGroupName,
//                             Class<? extends Job> jobClass, ScheduleBuilder<CronTrigger> scheduleBuilder) {
//        String jobName = String.format("%s:job", name);
//        String triggerName = String.format("%s:trigger", name);
//
//        JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
//
//        try {
//            JobDetail jobDetail = JobBuilder.newJob(jobClass)
//                    .withIdentity(jobName, jobGroupName)
//                    .storeDurably(true)
//                    .requestRecovery(true)
//                    .build();
//            Trigger trigger = TriggerBuilder.newTrigger()
//                    .startNow()
//                    .withIdentity(triggerName, triggerGroupName)
//                    .withSchedule(scheduleBuilder)
//                    .build();
//
//            if (taskEnable && !scheduler.checkExists(jobKey) && !scheduler.isShutdown()) {
//                scheduler.scheduleJob(jobDetail, trigger);
//                scheduler.start();
//            }
//        } catch (Exception e) {
//            log.error("[Txtanls] 新任务 {}-{} 创建失败; ErrorMsg {}", name, jobClass.getSimpleName(), e.getMessage());
//            EMAIL_LOG.error("[Txtanls] 新任务 {}-{} 创建失败; ErrorMsg {}", name, jobClass.getSimpleName(), e.getMessage());
//        }
//    }
//
//    /**
//     * 获取异步训练任务的锁的key
//     *
//     * @param projectId 项目id
//     * @return Lock key
//     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
//     * @date 2021/6/30 14:53
//     */
//    public String getTrainingJobLockKey(String projectId) {
//        return String.format("%s:%s", TRAIN_JOB_LOCK_PREFIX, projectId);
//    }
//}
